<?php

namespace support;

use app\utils\SqlRecord;
use support\Response;

class BaseResponse
{
    /**
     * 通用成功响应（推荐直接 return BaseResponse::ok($data)）
     * @param mixed $data
     * @param string $msg
     * @param int $code
     * @return Response
     */
    public static function ok($data = null, string $msg = 'success', int $code = 200): Response
    {
        $data = [
            'result' => 1,
            'code'   => $code,
            'msg'    => $msg,
            'data'   => $data,
        ];
//        if (in_array(config('app.env'), ['local', 'testing']) && class_exists(\app\utils\SqlRecord::class)) {
//            $data['_debug'] = [
//                'sql' => SqlRecord::getSqls(),
//            ];
//        }
        return json($data);
    }

    /**
     * 通用失败响应（推荐直接 return BaseResponse::fail($msg, $code, $data)）
     * @param string $msg
     * @param int $code
     * @param mixed $data
     * @return Response
     */
    public static function fail(string $msg = 'error', int | string $code = 400, $data = null): Response
    {
        $data = [
            'result' => 0,
            'code'   => $code,
            'msg'    => $msg,
            'data'   => $data,
        ];
        return json($data);
    }

    /**
     * 返回成功响应结构（数组）
     * @param mixed $data
     * @param string $msg
     * @param int $code
     * @return array
     */
    public static function success($data = null, string $msg = 'success', int $code = 200): array
    {
        return [
            'result' => 1,
            'code'   => $code,
            'msg'    => $msg,
            'data'   => $data,
        ];
    }

    /**
     * 返回错误响应结构（数组）
     * @param string $msg
     * @param int $code
     * @param mixed $data
     * @return array
     */
    public static function error(string $msg = 'error', int $code = 400, $data = null): array
    {
        return [
            'result' => 0,
            'code'   => $code,
            'msg'    => $msg,
            'data'   => $data,
        ];
    }

    /**
     * 自定义响应结构
     * @param int $result 0失败 1成功
     * @param int $code 具体响应码
     * @param string $msg
     * @param mixed $data
     * @param array $extra
     * @return array
     */
    public static function result(int $result, int $code, string $msg, $data = null, array $extra = []): array
    {
        return array_merge([
            'result' => $result,
            'code'   => $code,
            'msg'    => $msg,
            'data'   => $data,
        ], $extra);
    }

    /**
     * 直接输出json响应并终止
     * @param array $response
     */
    public static function send(array $response)
    {
        header('Content-Type: application/json; charset=utf-8');
        echo json_encode($response, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
        exit(0);
    }

    /**
     * 返回 webman 框架的 json 响应对象
     * @param array $response
     * @return \support\Response
     */
    public static function json(array $response): Response
    {
        return json($response);
    }
} 